home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ABUSESRC.ZIP / AbuseSrc / imlib / guistat.c < prev    next >
C/C++ Source or Header  |  1996-04-11  |  3KB  |  141 lines

  1. #include "status.hpp"
  2. #include "timing.hpp"
  3. #include "guistat.hpp"
  4.  
  5. class gui_status_node
  6. {
  7.   public :  
  8.   char *name;
  9.   gui_status_node *next;
  10.   visual_object *show;
  11.   jwindow *stat_win;
  12.   window_manager *wm;
  13.   int last_update;
  14.   time_marker last_time;
  15.   gui_status_node(char *Name, visual_object *Show, window_manager *WM, gui_status_node *Next) 
  16.   { name=strcpy((char *)jmalloc(strlen(Name)+1,"status name"),Name); 
  17.     show=Show;
  18.     next=Next; 
  19.     last_update=0;
  20.     stat_win=NULL;
  21.     wm=WM;
  22.   }
  23.   ~gui_status_node();
  24. } ; 
  25.  
  26.  
  27. gui_status_node::~gui_status_node()
  28.   jfree(name); 
  29.   if (show) 
  30.     delete show; 
  31.   if (stat_win) 
  32.   {
  33.     wm->close_window(stat_win);
  34.     wm->flush_screen();
  35.   }
  36. }
  37.  
  38. #ifdef __POWERPC__
  39. #pragma global_optimizer on
  40. #endif
  41.  
  42. void gui_status_manager::draw_bar(gui_status_node *whom, int perc)
  43. {
  44.   long l=whom->stat_win->x2()-whom->stat_win->x1()-6;
  45.   long h=wm->font()->height();
  46.  
  47.   whom->stat_win->screen->bar(whom->stat_win->x1()+1,whom->stat_win->y2()-h-1,whom->stat_win->x2()-1,
  48.               whom->stat_win->y2()-1,wm->black());
  49.   whom->stat_win->screen->bar(whom->stat_win->x1()+2,whom->stat_win->y2()-h,whom->stat_win->x2()-2,
  50.               whom->stat_win->y2()-2,wm->dark_color());
  51.   if (perc)
  52.     whom->stat_win->screen->bar(whom->stat_win->x1()+3,whom->stat_win->y2()-h+1,
  53.                 whom->stat_win->x1()+l*perc/100,
  54.                 whom->stat_win->y2()-3,wm->bright_color());
  55. }
  56.  
  57. #ifdef __POWERPC__
  58. #pragma global_optimizer reset
  59. #endif
  60.  
  61. void gui_status_manager::push(char *name, visual_object *show)
  62. {
  63.   first=new gui_status_node(name,show,wm,first);  
  64. }
  65.  
  66. gui_status_manager::gui_status_manager(window_manager *WM) 
  67.   wm=WM; 
  68.   first=NULL; 
  69.   strcpy(title,"STATUS"); 
  70.   last_perc=0;
  71. }
  72.  
  73. void gui_status_manager::update(int percentage)
  74. {
  75.   last_perc=percentage;
  76.   if (first)
  77.   {
  78.     if (!first->stat_win)
  79.     {
  80.       time_marker now;
  81.       if (now.diff_time(&first->last_time)>1)
  82.       {
  83.     long wx=xres/2,wy=10,len1=strlen(first->name)*wm->font()->width()+10,len2=0,len3,
  84.       h1=wm->font()->height()+5,h2=first->show ? first->show->height(wm) : 0;
  85.  
  86.     if (first->show) len2=first->show->width(wm)/2;
  87.     if (len2>len1) len3=len2; else len3=len1;
  88.     wx-=len3/2; 
  89.     
  90.     
  91.     gui_status_node *p=first->next;
  92.     while (p && !p->stat_win) p=p->next;
  93.     if (p) wy=p->stat_win->y+p->stat_win->y2()+5;
  94.  
  95.     int mx=WINDOW_FRAME_LEFT,my=WINDOW_FRAME_TOP;
  96.     first->stat_win=wm->new_window(wx,wy,len3, h1*2+h2,NULL,"status");
  97.     wm->font()->put_string(first->stat_win->screen,mx+1,my+1,first->name,wm->black());
  98.     wm->font()->put_string(first->stat_win->screen,mx,my,first->name,wm->bright_color());
  99.     if (first->show)
  100.       first->show->draw(first->stat_win->screen,(first->stat_win->x2()-first->stat_win->x1())/2-
  101.                 first->show->width(wm)/2,my+h1,wm,NULL);
  102.  
  103.     draw_bar(first,percentage);
  104.     wm->flush_screen();
  105.       }
  106.     } else
  107.     {
  108.       if (percentage>first->last_update)
  109.       {
  110.     first->last_update=percentage;
  111.     draw_bar(first,percentage);
  112.     wm->flush_screen();
  113.       }
  114.     }
  115.   } 
  116. }
  117.  
  118. void gui_status_manager::force_display()
  119. {
  120.   update(last_perc);
  121. }
  122.  
  123. void gui_status_manager::pop()
  124. {
  125.   CONDITION(first,"No status's to pop!");
  126.   gui_status_node *p=first;
  127.   first=first->next;
  128.   delete p;
  129. }
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.